{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [],
   "source": [
    "import codecs\n",
    "import jieba as jb\n",
    "import re\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "import pandas as pd\n",
    "import random\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.metrics.pairwise import cosine_similarity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "metadata": {},
   "outputs": [],
   "source": [
    "#中文分局\n",
    "def SentsTokenizer4Ch(text):\n",
    "    #sentences = re.split('(。|！|\\!|\\.|？|\\?)',text)\n",
    "    sentences = re.split('(。|！|\\!|？|\\?)',text)\n",
    "    new_sents = []\n",
    "    for i in range(int(len(sentences)/2)):\n",
    "        sent = sentences[2*i] + sentences[2*i+1]\n",
    "        sent = sent.replace('\\r\\n','')\n",
    "        sent = sent.strip()\n",
    "        new_sents.append(sent)\n",
    "    return new_sents\n",
    "\n",
    "#删除所有符号,只保留字母、数字和中文\n",
    "def remove_punctuation(line):\n",
    "    #line = str(line)\n",
    "    if line.strip()=='':\n",
    "        return ''\n",
    "    rule = re.compile(u\"[^a-zA-Z0-9\\u4E00-\\u9FA5]\")\n",
    "    line = rule.sub('',line)\n",
    "    return line\n",
    " \n",
    "#中文停用词\n",
    "def stopwordslist(filepath):  \n",
    "    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]  \n",
    "    return stopwords  \n",
    " \n",
    "#加载停用词\n",
    "stopwords = stopwordslist(\"./data/chineseStopWords.txt\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 301,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['5G网络是第五代移动通信网络，其峰值理论传输速度可达每秒数十Gb，比4G网络的传输速度快数百倍。',\n",
       " '举例来说，一部1G超高画质电影可在3秒之内下载完成。',\n",
       " '随着5G技术的诞生，用智能终端分享3D电影、游戏以及超高画质（UHD）节目的时代正向我们走来。',\n",
       " '三星电子通过研究和试验表明，在28GHz的超高频段，以每秒1Gb以上的速度，成功实现了传送距离在2Km范围内的数据传输。',\n",
       " '此前，世界上没有一个企业或机构开发出在6GHz以上的超高频段实现每秒Gb级以上的数据传输技术，这是因为难以解决超高频波长段带来的数据损失大、传送距离短等难题。',\n",
       " '三星电子利用64个天线单元的自适应阵列传输技术，使电波的远距离输送成为可能，并能实时追踪使用者终端的位置，实现数据的上下载交换。',\n",
       " '超高频段数据传输技术的成功，不仅保证了更高的数据传输速度，也有效解决了移动通信波段资源几近枯竭的问题。',\n",
       " '2014年5月13日，三星电子宣布，其已率先开发出了首个基于5G核心技术的移动传输网络，并表示将在2020年之前进行5G网络的商业推广。',\n",
       " '2016年8月4日，诺基亚与电信传媒公司贝尔再次在加拿大完成了5G信号的测试。',\n",
       " '在测试中诺基亚使用了73GHz范围内的频谱，数据传输速度也达到了现有4G网络的6倍。']"
      ]
     },
     "execution_count": 301,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "myfile = \"./data/chatbot-data/5G-ch.txt\"\n",
    "text = codecs.open(myfile, \"r\", \"utf-8\").read()\n",
    "sent_tokens = SentsTokenizer4Ch(text)\n",
    "sent_tokens[:10]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sent</th>\n",
       "      <th>clean_set</th>\n",
       "      <th>cut_sent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5G网络是第五代移动通信网络，其峰值理论传输速度可达每秒数十Gb，比4G网络的传输速度快数百倍。</td>\n",
       "      <td>5G网络是第五代移动通信网络其峰值理论传输速度可达每秒数十Gb比4G网络的传输速度快数百倍</td>\n",
       "      <td>5G 网络 是 第五代 移动 通信 网络 其 峰值 理论 传输速度 可 达 每秒 数十 Gb...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>举例来说，一部1G超高画质电影可在3秒之内下载完成。</td>\n",
       "      <td>举例来说一部1G超高画质电影可在3秒之内下载完成</td>\n",
       "      <td>举例来说 一部 1G 超 高画质 电影 可 在 3 秒 之内 下载 完成</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>随着5G技术的诞生，用智能终端分享3D电影、游戏以及超高画质（UHD）节目的时代正向我们走来。</td>\n",
       "      <td>随着5G技术的诞生用智能终端分享3D电影游戏以及超高画质UHD节目的时代正向我们走来</td>\n",
       "      <td>随着 5G 技术 的 诞生 用 智能 终端 分享 3D 电影 游戏 以及 超 高画质 UHD...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>三星电子通过研究和试验表明，在28GHz的超高频段，以每秒1Gb以上的速度，成功实现了传送距...</td>\n",
       "      <td>三星电子通过研究和试验表明在28GHz的超高频段以每秒1Gb以上的速度成功实现了传送距离在2...</td>\n",
       "      <td>三星电子 通过 研究 和 试验 表明 在 28GHz 的 超高频 段 以 每秒 1Gb 以上...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>此前，世界上没有一个企业或机构开发出在6GHz以上的超高频段实现每秒Gb级以上的数据传输技术...</td>\n",
       "      <td>此前世界上没有一个企业或机构开发出在6GHz以上的超高频段实现每秒Gb级以上的数据传输技术这...</td>\n",
       "      <td>此前 世界 上 没有 一个 企业 或 机构 开发 出 在 6GHz 以上 的 超高频 段 实...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                sent  \\\n",
       "0   5G网络是第五代移动通信网络，其峰值理论传输速度可达每秒数十Gb，比4G网络的传输速度快数百倍。   \n",
       "1                         举例来说，一部1G超高画质电影可在3秒之内下载完成。   \n",
       "2    随着5G技术的诞生，用智能终端分享3D电影、游戏以及超高画质（UHD）节目的时代正向我们走来。   \n",
       "3  三星电子通过研究和试验表明，在28GHz的超高频段，以每秒1Gb以上的速度，成功实现了传送距...   \n",
       "4  此前，世界上没有一个企业或机构开发出在6GHz以上的超高频段实现每秒Gb级以上的数据传输技术...   \n",
       "\n",
       "                                           clean_set  \\\n",
       "0      5G网络是第五代移动通信网络其峰值理论传输速度可达每秒数十Gb比4G网络的传输速度快数百倍   \n",
       "1                           举例来说一部1G超高画质电影可在3秒之内下载完成   \n",
       "2         随着5G技术的诞生用智能终端分享3D电影游戏以及超高画质UHD节目的时代正向我们走来   \n",
       "3  三星电子通过研究和试验表明在28GHz的超高频段以每秒1Gb以上的速度成功实现了传送距离在2...   \n",
       "4  此前世界上没有一个企业或机构开发出在6GHz以上的超高频段实现每秒Gb级以上的数据传输技术这...   \n",
       "\n",
       "                                            cut_sent  \n",
       "0  5G 网络 是 第五代 移动 通信 网络 其 峰值 理论 传输速度 可 达 每秒 数十 Gb...  \n",
       "1               举例来说 一部 1G 超 高画质 电影 可 在 3 秒 之内 下载 完成  \n",
       "2  随着 5G 技术 的 诞生 用 智能 终端 分享 3D 电影 游戏 以及 超 高画质 UHD...  \n",
       "3  三星电子 通过 研究 和 试验 表明 在 28GHz 的 超高频 段 以 每秒 1Gb 以上...  \n",
       "4  此前 世界 上 没有 一个 企业 或 机构 开发 出 在 6GHz 以上 的 超高频 段 实...  "
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#删除除字母,数字，汉字以外的所有符号\n",
    "df = pd.DataFrame(sent_tokens, columns=['sent'])\n",
    "df['clean_set']=  df['sent'].apply(remove_punctuation)\n",
    "\n",
    "#分词，并过滤停用词\n",
    "# df['cut_sent'] = df['clean_set'].apply(lambda x: \" \".join([w for w in list(jb.cut(x)) if w not in stopwords]))\n",
    "df['cut_sent'] = df['clean_set'].apply(lambda x: \" \".join([w for w in list(jb.cut(x))]))\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 322,
   "metadata": {},
   "outputs": [],
   "source": [
    "GREETING_INPUTS = (\"你好\", \"hi\", \"有人\", \"在吗\", \"嗨\",\"在不在\",\"有人吗\",'在','有人')\n",
    "GREETING_RESPONSES = [\"你好\",  \"我在\", \"请问,有什么可以帮您的吗?\", \"你好，我在\", \"你好，很高兴见到你！\"]\n",
    "\n",
    "def greeting(sentence):\n",
    "    rule = re.compile(u\"[^a-zA-Z0-9\\u4E00-\\u9FA5]\")\n",
    "    text = rule.sub('',sentence)\n",
    "    if text in GREETING_INPUTS:\n",
    "        return random.choice(GREETING_RESPONSES)\n",
    "    \n",
    "    wordlist =  [w for w in jieba.cut(sentence)]\n",
    "    for word in wordlist:\n",
    "        if word in GREETING_INPUTS:\n",
    "            return random.choice(GREETING_RESPONSES)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 323,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'你好，我在'"
      ]
     },
     "execution_count": 323,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "greeting('有人在吗？')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 291,
   "metadata": {},
   "outputs": [],
   "source": [
    "def response(user_response):\n",
    "    robo_response=''\n",
    "    user_response  = remove_punctuation(user_response)\n",
    "    user_response= \" \".join([w for w in list(jb.cut(user_response)) if w not in stopwords])\n",
    "    cut_sent = df.cut_sent.values.tolist()\n",
    "    cut_sent.append(user_response)\n",
    "    tfidf = TfidfVectorizer()\n",
    "\n",
    "    tfidf_vec = tfidf.fit_transform(cut_sent)\n",
    "\n",
    "    cos_sim = cosine_similarity(tfidf_vec[-1], tfidf_vec)\n",
    "    idx=cos_sim.argsort()[0][-2]\n",
    "    flat = cos_sim.flatten()\n",
    "    flat.sort()\n",
    "    req_tfidf = flat[-2]\n",
    "\n",
    "    if(req_tfidf==0):\n",
    "        robo_response=robo_response+\"对不起,我不理解您的意思,我还是个小白...!\"\n",
    "        return(robo_response)\n",
    "    else:\n",
    "        robo_response = robo_response+df.sent.values[idx]\n",
    "        return(robo_response) \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 324,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "机器人: 我的名字叫小白. 我可以回答您关于5G的问题. 如果您想退出, 请输入:bye !\n",
      "你好\n",
      "机器人: 请问,有什么可以帮您的吗?\n",
      "\n",
      "什么是5G网络啊？\n",
      "机器人: 三星在5G网络上的取代技术突破，将给全球5G网络研发带来活力，并推动其商业化进程，同时有助于5G网络技术国际标准的制定。\n",
      "\n",
      "5G网络的传输速度怎么样？\n",
      "机器人: 5G网络是第五代移动通信网络，其峰值理论传输速度可达每秒数十Gb，比4G网络的传输速度快数百倍。\n",
      "\n",
      "5G下载电影快吗？\n",
      "机器人: 举例来说，一部1G超高画质电影可在3秒之内下载完成。\n",
      "\n",
      "上海什么时候有5G啊？\n",
      "机器人: 中国移动将在杭州、上海、广州、苏州、武汉这五个城市开展5G外场测试。\n",
      "\n",
      "5G的峰值有多少啊？\n",
      "机器人: 2014年7月，爱立信宣布，在5G无线技术一项无线测试中，传输速度峰值达到了5Gbps。\n",
      "\n",
      "5G什么时候能商用？\n",
      "机器人: 根据工信部等部门提出的5G推进工作部署以及三大运营商的5G商用计划，我国将于2017年展开5G网络第二阶段测试，2018年进行大规模试验组网，并在此基础上于2019年启动5G网络建设，最快2020年正式推出商用服务。\n",
      "\n",
      "华为的5G怎么样？\n",
      "机器人: 华为在17日举行的一场3GPP RAN1 87次会议的5G短码讨论方案中，凭借59家代表的支持，以极化码（Polar Code）战胜了高通主推的LDPC及法国的Turbo2.0方案，拿下5G时代的话语权。\n",
      "\n",
      "5G用的是什么技术啊？\n",
      "机器人: 三星在5G网络上的取代技术突破，将给全球5G网络研发带来活力，并推动其商业化进程，同时有助于5G网络技术国际标准的制定。\n",
      "\n",
      "你是个笨蛋\n",
      "机器人: 对不起,我不理解你的意思,我还是个小白...!\n",
      "\n",
      "bye\n",
      "小白: 再见! 欢迎再次光临!\n"
     ]
    }
   ],
   "source": [
    "flag=True\n",
    "print(\"机器人: 我的名字叫小白. 我可以回答您关于5G的问题. 如果您想退出, 请输入:bye !\")\n",
    "\n",
    "while(flag==True):\n",
    "    user_response = input()\n",
    "    user_response=user_response.lower()\n",
    "    if(user_response!='bye'):\n",
    "        if(user_response=='多谢' or user_response=='谢谢' ):\n",
    "            flag=False\n",
    "            print(\"机器人: 不用谢！\")\n",
    "        else:\n",
    "            if(greeting(user_response)!=None):\n",
    "                print(\"机器人: \"+greeting(user_response))\n",
    "                print()\n",
    "            else:\n",
    "                print(\"机器人: \",end=\"\")\n",
    "                print(response(user_response))\n",
    "                print()\n",
    "    else:\n",
    "        flag=False\n",
    "        print(\"小白: 再见! 欢迎再次光临!\")    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
